home *** CD-ROM | disk | FTP | other *** search
- /* A simple XFCN that calls HMShowBalloon with the appropriate parameters. */
- /* Usage: ShowBalloon(type,content,tip,rect)
- /* Written by Paul Snively, MacDTS. */
- /* Thanks to Neil Day for helping w/the C and putting up with my whining. */
-
- #include <types.h>
- #include <balloons.h>
- #include <hyperxcmd.h>
-
- pascal void EntryPoint (XCmdPtr paramPtr) // Standard XFCN function declaration
- {
- OSErr anOSErr; // What we ultimately return to HyperCard
- HMMessageRecord anHMMessage; // What it is that we wish to have in the balloon
- Rect aRect; // The alternateRect for HMShowBalloon
- long *aPtr; // So we can play fast and loose with anHMMessage
- Str255 aStr; // A Pascal-style string for lotsa temp stuff
- Point aPoint; // Where the tip of the balloon should be
- Handle aHandle; // For the value to return to HyperCard
-
- /* Parameter 0 is the type (a number), so we convert C string to Pascal, and then to a long */
- ZeroToPas(paramPtr,(StringPtr) *(paramPtr->params[0]),&aStr);
- anHMMessage.hmmHelpType = StrToLong(paramPtr, &aStr);
- /* anHMMessage is a union; if we point to it via a long *, we get away with everything we need */
- aPtr = (long *) &anHMMessage.u;
- /* There are three cases: moving a string, storing a short, storing a long */
- switch (anHMMessage.hmmHelpType) {
- case khmmString:
- ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[1]), (StringPtr) aPtr);
- break;
- case khmmPict:
- case khmmTERes:
- case khmmSTRRes:
- ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[1]), &aStr);
- *aPtr = StrToLong(paramPtr, &aStr) << 0x10;
- break;
- case khmmTEHandle:
- case khmmStringRes:
- case khmmPictHandle:
- ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[1]), &aStr);
- *aPtr = StrToLong(paramPtr, &aStr);
- break;
- }
-
- /* Next comes the tip (a Point), which must be in global coordinates */
- ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[2]), &aStr);
- StrToPoint(paramPtr, &aStr, &aPoint);
- LocalToGlobal(&aPoint);
-
- /* Finally, the alternateRect, which must also be in global coordinates. StrToRect is SLOW */
- ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[3]), &aStr);
- StrToRect(paramPtr, &aStr, &aRect);
- LocalToGlobal((Point *) &aRect.top);
- LocalToGlobal((Point *) &aRect.bottom);
-
- /* Finally, we can call the Help Manager using no proc, balloon def, etc. and without saving bits */
- anOSErr = HMShowBalloon(&anHMMessage,aPoint,&aRect,NULL,NULL,NULL,false);
-
- /* Next we massage the OSErr into a zero-terminated string to return to HyperCard */
- NumToStr(paramPtr, (long) anOSErr, &aStr);
- aHandle = PasToZero(paramPtr, &aStr);
- paramPtr->returnValue = aHandle;
- }
-